Semantik Web  •  Hafta 05

OWL İleri Konular & Protégé

Restriction'lar, cardinality, karmaşık sınıf tanımları, Protégé'de önemli noktalar ve OWL API ile ilk Java adımları

Lisansüstü Semantik Web Dersi  •  CMPE 583

Hafta 05  •  Kazanımlar

Bu hafta sonunda

  • someValuesFrom / allValuesFrom / hasValue kısıtlarını doğru yerde kullanabileceksiniz.
  • Cardinality ve kapanış aksiyomlarıyla "güvenli ürün" gibi tanımlar yazabileceksiniz.
  • Protégé'de kısıt girme, reasoner çalıştırma ve gerekçe okuma işlerini yapabileceksiniz.
  • Güncel sürüm/uyumluluk tablosunu kullanarak ortamı doğru kurabileceksiniz.
  • OWL API ile ontolojiyi yükleyip aksiyom ekleyebileceksiniz.

01

Ödev 4'ün Çözümü

Tanımlı sınıf, çıkarım kanıtı ve çelişki analizi.

Çözüm 4.1 — LactoseRiskPerson

LactoseRiskPerson EquivalentTo Person and (hasAllergy value Lactose) and (ChooseProduct some (Contain some (Triggers value Lactose)))
Üyeler: TC_001 (Nisin) TC_002 (Casein) TC_003 (Casein)

S6+S7'nin yerini tutmaz: hangi katkının suçlu olduğunu (Effected_Allergen) üretmez, yalnızca sınıflandırır.

Çözüm 4.2 — Çelişkinin gerekçesi

Explanation for: Nothing SubClassOf TC_009 1) TC_009 Type Person 2) TC_009 Contain Nisin 3) Contain Domain Product 4) Person DisjointWith Product

Dört satır, hatanın tam zinciridir. Explain ekranını okumak, ontoloji hata ayıklamanın en önemli becerisidir: reasoner size sadece "tutarsız" demez, hangi aksiyomlar yüzünden olduğunu söyler.

02

Restriction'lar

Anonim sınıflar: some, only, value, cardinality.

Kısıt: adı olmayan bir sınıf

<owl:Restriction> <owl:onProperty rdf:resource="#Contain"/> <owl:someValuesFrom rdf:resource="#FoodAdditives"/> </owl:Restriction>
  • Bu ifade "en az bir katkı içeren şeyler" kümesidir.
  • Adı yoktur; blank node olarak yazılır.
  • Bir sınıfa subClassOf veya equivalentClass ile bağlanır.

someValuesFrom — "en az bir"

RiskyProduct EquivalentTo Product and (Contain some (Triggers some Allergy))

Okunuşu: en az bir katkı içeriyor ve o katkı en az bir alerji tetikliyor.

EAN_00004 → RiskyProduct ✓ (Nisin → Lactose) EAN_00001 → RiskyProduct ✓ (Alginic_Acid → Gluten)

allValuesFrom — "yalnızca"

VeganProduct SubClassOf Product and (Contain only PlantBasedAdditive)

Okunuşu: içerdiği bütün katkılar bitkisel kökenli olmalı.

Tuzak: hiç katkısı bildirilmemiş bir ürün de bu kısıtı sağlar — "hepsi" boş kümede doğrudur.

some ile only farkı

DurumContain some AllergenContain only Allergen
Bir alerjen + bir nötr katkıDoğruYanlış
Sadece nötr katkılarYanlışYanlış
Hiç katkı bildirilmemişYanlışDoğru

Risk modellemesinde some kullanılır: pozitif kanıt arar. Güvenlik iddiası için only gerekir ve mutlaka kapanış aksiyomu ile birlikte kullanılmalıdır.

hasValue — belirli bir bireye bağlanmak

LactoseIntolerantPerson EquivalentTo Person and (hasAllergy value Lactose)
LactoseTrigger EquivalentTo FoodAdditives and (Triggers value Lactose) Üyeler: Nisin, Casein

value bireye, some sınıfa bağlanır. Karıştırmak, boş sınıfların en yaygın nedenidir.

Cardinality: min, max, exactly

ManchesterAnlamıAlerji örneği
min 1 ContainEn az birHer ürün en az bir katkı içerir
max 0 ContainHiç yokKatkısız ürün
exactly 1 hasBarcodeTam birTek barkod
min 2 Contain FoodAdditivesNitelikli (OWL 2)Çok katkılı ürün

Nitelikli sayı kısıtı OWL 2 ile geldi: sayı ile birlikte tür de belirtilir.

Sayı kısıtı çıkarım üretir

MultiAdditiveProduct EquivalentTo Product and (Contain min 2 FoodAdditives)
EAN_00002 ✓ (2 katkı) EAN_00003 ✓ (2 katkı) EAN_00004 ✓ (3 katkı) EAN_00001 ✗ (1 katkı)

Dikkat: sayım için bireylerin farklı olduğu bilinmelidir. Tekil isim varsayımı olmadığı için gerekirse AllDifferent bildirilir.

Kapanış aksiyomu: "başka katkı yok"

EAN_00003 Type Contain only {Casein, Sodium_Ascorbite}

Bu bildirim olmadan açık dünya "başka katkılar da olabilir" der ve hiçbir güvenlik iddiası çıkarılamaz.

Pratik: etiketi tam okunmuş ürünlere kapanış aksiyomu ekleyin; kısmi okunanlara eklemeyin.

"Laktoz için güvenli ürün" tanımı

LactoseSafeProduct EquivalentTo Product and (Contain only (not (Triggers value Lactose)))
ÜrünKapanış var mıSonuç
EAN_00001EvetGüvenli (Alginic_Acid → Gluten)
EAN_00003EvetGüvenli değil (Casein)
EAN_00004HayırKarar verilemez

Gerekli mi, gerekli ve yeterli mi?

SubClassOf — gerekli

PersonAtRisk ⊑ Person

Riskli kişi kişidir; ama kişinin riskli olduğu çıkarılmaz.

EquivalentTo — gerekli ve yeterli

RiskyProduct ≡ Product ⊓ ∃Contain…

Koşulu sağlayan her ürün sınıfa otomatik girer.

Projede PersonAtRisk bilinçli olarak subClassOf'tur: üyeliği SWRL kuralı üretir, böylece hangi kuralın sorumlu olduğu izlenebilir.

Sayılan sınıf (oneOf) ve ayrık birleşim

Allergy EquivalentTo {Lactose, Egg, Fish, Gluten}
Person DisjointUnionOf Adult, Minor

İlk aksiyom alerji listesini kapatır: yeni bir alerji eklemek artık modeli değiştirmek anlamına gelir. Bu bilinçli bir karardır — projede kapatmadık.

HasKey: barkod ürünü belirler

HasKey(Product () (hasBarcode)) :P1 :hasBarcode "8690504" . :P2 :hasBarcode "8690504" . → :P1 owl:sameAs :P2

Farklı kataloglardan gelen iki kayıt aynı barkodu taşıyorsa reasoner bunları tek ürün olarak birleştirir. Veri bütünleştirmenin en zarif yolu.

Veri aralığı kısıtı: BMI sınıfları

ObesePerson EquivalentTo Person and (hasBMI some double[>= 30.0]) NormalWeightPerson EquivalentTo Person and (hasBMI some double[>= 18.5 , < 25.0])
S4 kuralı sonrası: TC_001 23.92 → Normal TC_002 28.26 → Fazla kilolu TC_003 26.60 → Fazla kilolu TC_004 33.43 → Obez

Kural aritmetiği üretir, OWL sınıflandırır: iki teknolojinin doğru iş bölümü budur.

Negatif özellik bildirimi

NegativeObjectPropertyAssertion( :Contain :EAN_00001 :Nisin )

Açık dünyada "içermiyor" bilgisini açıkça yazmanın yolu. Laboratuvar testi ile doğrulanmış yokluk için kullanılır; test edilmemiş yokluk için kullanılmamalıdır.

03

Protégé: Önemli Noktalar

Kısıt girme, reasoner, gerekçe, DL Query ve sürümler.

Kısıt nasıl girilir?

EntitiesIndividuals by classSWRLTab
Class: RiskyProduct  ›  Equivalent To  ›  [+] Product and (Contain some (Triggers some Allergy)) Class expression editor  ·  Ctrl+Space = otomatik tamamlama
OKCancel

Şematik gösterim. Söz dizimi hatası varsa editör kırmızı çerçeve gösterir ve OK düğmesi devre dışı kalır.

Reasoner çalıştıktan sonra ne görürsünüz?

Reasoner  ›  HermiT 1.4.5  ›  Start reasoner  •  Synchronise
Inferred class hierarchy ▾ Product RiskyProduct (inferred) ▾ Person PersonAtRisk (inferred)
Explanation for: EAN_00004 Type RiskyProduct 1) EAN_00004 Contain Nisin 2) Nisin Triggers Lactose 3) Lactose Type Allergy 4) RiskyProduct EquivalentTo …

Sarı zeminli satırlar çıkarımdır; dosyaya yazılmazlar. Kalıcı istiyorsanız sonraki slayta bakın.

Çıkarımı dosyaya yazmak

YolNeredeNot
Export inferred axiomsFile → Export inferred axioms as ontologyHangi tür aksiyomların yazılacağı seçilir
ProgramatikInferredOntologyGeneratorProjede ADIM 8'de kullanılıyor
SWRL motoruDrools → OWLKural çıktısını asserted yazar

Bu ayrım sınavda sorulur: çıkarım geçicidir, materialization kalıcıdır. Projede ikisini de yapıyoruz.

DL Query: sınıf ifadesiyle sorgulama

EntitiesDL QuerySPARQL Query
Person and (hasAllergy value Lactose) ☑ Instances   ☐ Subclasses   ☑ Direct only TC_001, TC_002, TC_003

DL Query, ontolojiyi bozmadan hipotez denemenin en hızlı yoludur; sınıf yazmadan sonucu görürsünüz.

Ontology metrics: sağlık kontrolü

Metrics — ALLERGY_FIXED.owl Axiom           118 Logical axiom     93 Class count       6 Object property   9 Data property     6 Individual        17 SWRL rule         7
  • Mantıksal aksiyom sayısı, modelin gerçek büyüklüğüdür.
  • Sınıf sayısı çok, aksiyom sayısı az ise: taksonomi var, mantık yok.
  • DL ifadesi (SROIQ) panelde görünür; profil kontrolü için kullanın.

Sık karşılaşılan tutarsızlık kaynakları

NedenBelirtiÇözüm
Ayrık sınıflara aynı bireyNothing altında bireyTip bildirimini düzelt
Functional özelliğe iki değerTutarsız ontolojiDeğeri tekilleştir
max 0 kısıtı + bildirimBoş sınıf çelişkisiKısıtı gevşet
Yanlış range + literal tipiDatatype çelişkisixsd tipini eşitle
Kural çıktısı ile kısıt çakışmasıinfer() sonrası tutarsızKuralı DL-safe yap

Güncel sürümler ve uyumluluk

BileşenSürümNot
Protégé Desktop5.6.xJava 11 ile paketli dağıtımlar mevcut
OWL API4.5.x  /  5.xProtégé 5.6 → 4.5 dalı
HermiT1.4.5OWL API 4 ve 5 yapıları ayrı
Pellet / OpenlletOpenllet 2.6.xPellet'in sürdürülen çatalı
SWRLAPI + Drools2.xOWL API 4 ile uyumlu
JDK8 veya 11SWRLAPI için 8 en güvenli

Kural: SWRLAPI hangi OWL API dalını istiyorsa bütün projeyi o dala sabitleyin. Karışık sürüm en sık görülen kurulum hatasıdır.

Kurmanız gereken eklentiler

EklentiİşiProjede
SWRLTab / SWRLAPIKural yazma ve çalıştırmaZorunlu (Hafta 07)
SQWRLTabKural üstü sorguZorunlu (Hafta 10)
HermiT / OpenlletReasonerZorunlu
OntoGrafGraf görselleştirmeÖnerilir
CellfieExcel'den birey üretmeBüyük katalog için

Kurulum: File → Check for plugins; kurulumdan sonra Protégé yeniden başlatılmalıdır.

04

Java'ya İlk Adım

OWL API ile yükleme, okuma, aksiyom ekleme — yavaş yavaş.

Adım 0 — pom.xml bağımlılıkları

<dependency> <groupId>net.sourceforge.owlapi</groupId> <artifactId>owlapi-distribution</artifactId> <version>4.5.29</version> </dependency> <dependency> <groupId>net.sourceforge.owlapi</groupId> <artifactId>org.semanticweb.hermit</artifactId> <version>1.4.5.519</version> </dependency>

SWRL API bağımlılıklarını Hafta 08'de ekleyeceğiz; şimdilik ontolojiyi okuyup yazmaya odaklanıyoruz.

Adım 1 — Ontolojiyi yükle

OWLOntologyManager man = OWLManager.createOWLOntologyManager(); OWLDataFactory df = man.getOWLDataFactory(); OWLOntology ont = man.loadOntologyFromOntologyDocument( new File("ALLERGY_FIXED.owl")); System.out.println("Aksiyom sayisi: " + ont.getAxiomCount());

Üç nesne: manager dosya işlerini, data factory yeni varlık üretmeyi, ontology aksiyomları tutar. Projedeki Main.java ADIM 1 aynısını yapar.

Adım 2 — Sınıf ve bireyleri listele

for (OWLClass c : ont.getClassesInSignature()) System.out.println(c.getIRI().getShortForm()); OWLClass person = df.getOWLClass( IRI.create(NS + "Person")); EntitySearcher.getIndividuals(person, ont) .forEach(i -> System.out.println( " " + i.getIRI().getShortForm()));
Person Product FoodAdditives Allergy Adult PersonAtRisk TC_001 TC_002 TC_003 TC_004

Adım 3 — Kısıt aksiyomu ekle

OWLClass product = df.getOWLClass(IRI.create(NS + "Product")); OWLClass additives = df.getOWLClass(IRI.create(NS + "FoodAdditives")); OWLObjectProperty contain = df.getOWLObjectProperty(IRI.create(NS + "Contain")); // Product ⊑ ∃Contain.FoodAdditives OWLClassExpression expr = df.getOWLObjectSomeValuesFrom(contain, additives); man.addAxiom(ont, df.getOWLSubClassOfAxiom(product, expr));

Protégé'de tek satırda yazdığınız kısıt, API'de üç nesne olarak kurulur: özellik, sınıf, ifade.

Adım 4 — Sayı kısıtı ve ayrıklık

// Contain min 2 FoodAdditives OWLClassExpression min2 = df.getOWLObjectMinCardinality(2, contain, additives); man.addAxiom(ont, df.getOWLEquivalentClassesAxiom( df.getOWLClass(IRI.create(NS + "MultiAdditiveProduct")), df.getOWLObjectIntersectionOf(product, min2))); // Person ⊓ Product = ∅ man.addAxiom(ont, df.getOWLDisjointClassesAxiom( df.getOWLClass(IRI.create(NS + "Person")), product));

Adım 5 — HermiT ile denetle

OWLReasonerFactory rf = new org.semanticweb.HermiT.ReasonerFactory(); OWLReasoner hermit = rf.createReasoner(ont); System.out.println("Tutarli mi? " + hermit.isConsistent()); OWLClass risky = df.getOWLClass(IRI.create(NS + "MultiAdditiveProduct")); hermit.getInstances(risky, false).getFlattened() .forEach(i -> System.out.println(" " + i.getIRI().getShortForm())); hermit.dispose();
Tutarli mi? true EAN_00002 EAN_00003 EAN_00004

Adım 6 — Diske yaz

File out = new File("ALLERGY_STEP5.owl"); man.saveOntology(ont, new RDFXMLDocumentFormat(), IRI.create(out.toURI())); System.out.println("Yazildi: " + out.getAbsolutePath());
Format sınıfıÇıktı
RDFXMLDocumentFormatRDF/XML (projede)
TurtleDocumentFormatTurtle
FunctionalSyntaxDocumentFormatFunctional

05

Ödev ve Proje Adımı

Kısıtlarla zenginleşen ontoloji ve ilk Java çalıştırması.

Ödev 5 — Kısıtlar ve ilk Java kodu

  1. Ontolojinize üç kısıt ekleyin: biri some, biri only, biri sayı kısıtı.
  2. Bir "güvenli" sınıfı kapanış aksiyomu ile tanımlayın.
  3. Reasoner çıkarımını explain ekranıyla belgeleyin.
  4. Maven projesi kurup ontolojiyi Java'dan yükleyin, envanteri yazdırın.
  5. Java ile bir kısıt aksiyomu ekleyip dosyayı yeniden kaydedin.

Teslim

.owl + Maven projesi + konsol çıktısı ekran görüntüsü + 3 sayfa rapor.

Çözümü Hafta 06'nın başında ele alacağız.

Değerlendirme ölçütleri

ÖlçütAğırlıkBeklenen
Kısıt doğruluğu30%some/only/sayı yerinde kullanılmış
Kapanış aksiyomu20%Güvenlik iddiası gerekçeli
Explain analizi15%Aksiyom zinciri okunmuş
Java kurulumu20%Proje derleniyor, çalışıyor
Aksiyom ekleme15%Dosyada görülebiliyor

Kaynaklar

  • W3C — OWL 2 Primer, kısıtlar ve sayı kısıtları bölümleri.
  • Horridge, M. — A Practical Guide To Building OWL Ontologies Using Protégé 5.
  • OWL API belgeleri ve örnek kod deposu (owlcs/owlapi).
  • HermiT ve Openllet proje sayfaları — sürüm notları.
  • Stanford BMIR — Protégé eklenti kataloğu.

Özet  •  1 / 2

Kısıtlar

  • some pozitif kanıt arar; risk modellemesinin dili.
  • only güvenlik iddiası kurar; kapanış aksiyomu olmadan işe yaramaz.
  • Sayı kısıtları bireylerin farklılığı bilinmedikçe sayamaz.
  • EquivalentTo üyelik üretir, SubClassOf üretmez.

Özet  •  2 / 2

Protégé, sürümler ve Java

  • Explain ekranı hata ayıklamanın merkezidir.
  • Çıkarım geçici, materialization kalıcıdır.
  • Sürümleri SWRLAPI'nin istediği OWL API dalına sabitleyin.
  • OWL API: manager, data factory, ontology üçlüsü.

Hafta 06'da

OWL-S: semantik web servisleri, Profile / Process Model / Grounding ve öneri servisinin tanımı.

Ayrıca: Ödev 5'in ayrıntılı çözümü.

Tekrar Soruları

Kendinizi sınayın

  1. Katkısı bildirilmemiş ürün neden only kısıtını sağlar?
  2. Kapanış aksiyomu hangi varsayımı yerel olarak kapatır?
  3. min 2 kısıtı neden AllDifferent isteyebilir?
  4. hasValue ile some arasındaki fark nedir?
  1. Explain ekranındaki dört satır ne anlatır?
  2. Export inferred axioms ile Drools → OWL farkı nedir?
  3. HasKey iki kaydı nasıl birleştirir?
  4. Neden bütün proje tek OWL API dalına sabitlenmeli?

Alıştırma  •  Sınıf içi

Güvenli ürünü çıkarılabilir yap

EAN_00001 yalnızca Alginic_Acid içeriyor. Bu ürünün laktoz için güvenli olduğu çıkarılabilsin.

EAN_00001 Type Contain only { ______ } LactoseSafeProduct EquivalentTo Product and (Contain only (not ______))

Sorular

  1. Kapanış aksiyomu olmadan sonuç ne olurdu?
  2. EAN_00004 için aynı iddia neden yazılamaz?
  3. Bu tanım hangi hasta profilinden bağımsızdır?

Çözüm Hafta 06'da.